package com.eastfair.venueservice.entity;

import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelEntity;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.eastfair.core.base.entity.Entity;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.Accessors;
import static com.eastfair.core.utils.DateUtils.DEFAULT_DATE_TIME_FORMAT;
import com.eastfair.annotation.model.EchoVO;
import com.eastfair.venueservice.enumeration.ServiceBookingOrderStatusEnum;
import com.eastfair.venueservice.enumeration.ServiceBookingWorkOrderStatusEnum;
import com.eastfair.venueservice.enumeration.ServiceBookingPayStateEnum;
import com.eastfair.venueservice.enumeration.ServiceBookingReportSpaceStatusEnum;
import com.eastfair.venueservice.enumeration.ServiceBookingReportCheckStatusEnum;

import static com.baomidou.mybatisplus.annotation.SqlCondition.LIKE;

/**
 * <p>
 * 实体类
 * 服务预订项
 * </p>
 *
 * @author linan
 * @since 2023-03-07
 */
@Data
@NoArgsConstructor
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("vsm_service_booking")
@ApiModel(value = "ServiceBooking", description = "服务预订项")
@AllArgsConstructor
public class ServiceBooking extends Entity<Long> implements EchoVO {

    private static final long serialVersionUID = 1L;
    @TableField(exist = false)
    private Map<String, Object> echoMap = new HashMap<>();
    /**
     * 是否启用（确认状态）：1是 已确认；0否 未确认
     */
    @ApiModelProperty(value = "是否启用（确认状态）：1是 已确认；0否 未确认")
    @TableField(value = "is_enabled")
    @Excel(name = "是否启用（确认状态）：1是 已确认；0否 未确认")
    private Integer isEnabled;

    /**
     * 是否删除：1是；0否
     */
    @ApiModelProperty(value = "是否删除：1是；0否")
    @TableField(value = "is_deleted")
    @Excel(name = "是否删除：1是；0否")
    private Integer isDeleted;

    /**
     * 项目id
     */
    @ApiModelProperty(value = "项目id")
    @TableField(value = "project_id")
    @Excel(name = "项目id")
    private Long projectId;

    /**
     * 子系统id
     */
    @ApiModelProperty(value = "子系统id")
    @TableField(value = "subsystem_id")
    @Excel(name = "子系统id")
    private Long subsystemId;

    /**
     * 租户id
     */
    @ApiModelProperty(value = "租户id")
    @TableField(value = "tenant_id")
    @Excel(name = "租户id")
    private Long tenantId;

    /**
     * 服务项id
     */
    @ApiModelProperty(value = "服务项id")
    @TableField(value = "service_item_id")
    @Excel(name = "服务项id")
    private Long serviceItemId;

    /**
     * 服务名称
     */
    @ApiModelProperty(value = "服务名称")
    @Size(max = 255, message = "服务名称长度不能超过255")
    @TableField(value = "service_name", condition = LIKE)
    @Excel(name = "服务名称")
    private String serviceName;

    /**
     * 服务图片
     */
    @ApiModelProperty(value = "服务图片")
    @Size(max = 255, message = "服务图片长度不能超过255")
    @TableField(value = "pic_url", condition = LIKE)
    @Excel(name = "服务图片")
    private String picUrl;

    /**
     * 计量单位 字典维护
     */
    @ApiModelProperty(value = "计量单位 字典维护")
    @Size(max = 255, message = "计量单位 字典维护长度不能超过255")
    @TableField(value = "cal_unit", condition = LIKE)
    @Excel(name = "计量单位 字典维护")
    private String calUnit;

    /**
     * 服务单价
     */
    @ApiModelProperty(value = "服务单价")
    @TableField(value = "unit_price")
    @Excel(name = "服务单价")
    private BigDecimal unitPrice;

    /**
     * 附加费
     */
    @ApiModelProperty(value = "附加费")
    @TableField(value = "surcharge")
    @Excel(name = "附加费")
    private BigDecimal surcharge;

    /**
     * 服务分类id
     */
    @ApiModelProperty(value = "服务分类id")
    @TableField(value = "service_category_id")
    @Excel(name = "服务分类id")
    private Long serviceCategoryId;

    /**
     * 服务规格id
     */
    @ApiModelProperty(value = "服务规格id")
    @TableField(value = "service_specs_id")
    @Excel(name = "服务规格id")
    private Long serviceSpecsId;

    /**
     * 预订数量
     */
    @ApiModelProperty(value = "预订数量")
    @TableField(value = "booking_num")
    @Excel(name = "预订数量")
    private Long bookingNum;

    /**
     * 备注
     */
    @ApiModelProperty(value = "备注")
    @Size(max = 255, message = "备注长度不能超过255")
    @TableField(value = "remark", condition = LIKE)
    @Excel(name = "备注")
    private String remark;

    /**
     * 审核状态
     */
    @ApiModelProperty(value = "审核状态")
    @Size(max = 255, message = "审核状态长度不能超过255")
    @TableField(value = "audit_state", condition = LIKE)
    @Excel(name = "审核状态")
    private String auditState;

    /**
     * 审核意见
     */
    @ApiModelProperty(value = "审核意见")
    @Size(max = 512, message = "审核意见长度不能超过512")
    @TableField(value = "audit_opinion", condition = LIKE)
    @Excel(name = "审核意见")
    private String auditOpinion;

    /**
     * 是否生成订单：1是；0否
     */
    @ApiModelProperty(value = "是否生成订单：1是；0否")
    @TableField(value = "generate_order")
    @Excel(name = "是否生成订单：1是；0否")
    private Integer generateOrder;

    /**
     * 预订时间
     */
    @ApiModelProperty(value = "预订时间")
    @TableField(value = "booking_time")
    @Excel(name = "预订时间", format = DEFAULT_DATE_TIME_FORMAT, width = 20)
    private LocalDateTime bookingTime;

    /**
     * 展会id
     */
    @ApiModelProperty(value = "展会id")
    @TableField(value = "exhibition_manage_id")
    @Excel(name = "展会id")
    private Long exhibitionManageId;

    /**
     * 报馆id
     */
    @ApiModelProperty(value = "报馆id")
    @TableField(value = "report_space_id")
    @Excel(name = "报馆id")
    private Long reportSpaceId;

    /**
     * 申报系统 字典维护 MENU_AFFILIATION
     */
    @ApiModelProperty(value = "申报系统 字典维护 MENU_AFFILIATION")
    @Size(max = 255, message = "申报系统 字典维护 MENU_AFFILIATION长度不能超过255")
    @TableField(value = "declaration_system", condition = LIKE)
    @Excel(name = "申报系统 字典维护 MENU_AFFILIATION")
    private String declarationSystem;

    /**
     * 服务提供方 字典维护 MENU_AFFILIATION
     */
    @ApiModelProperty(value = "服务提供方 字典维护 MENU_AFFILIATION")
    @Size(max = 255, message = "服务提供方 字典维护 MENU_AFFILIATION长度不能超过255")
    @TableField(value = "provider_system", condition = LIKE)
    @Excel(name = "服务提供方 字典维护 MENU_AFFILIATION")
    private String providerSystem;

    /**
     * 折扣
     */
    @ApiModelProperty(value = "折扣")
    @TableField(value = "discount")
    @Excel(name = "折扣")
    private BigDecimal discount;

    /**
     * 业务主体id
     */
    @ApiModelProperty(value = "业务主体id")
    @TableField(value = "business_id")
    @Excel(name = "业务主体id")
    private Long businessId;

    /**
     * 展位编码
     */
    @ApiModelProperty(value = "展位编码")
    @Size(max = 255, message = "展位编码长度不能超过255")
    @TableField(value = "site_code", condition = LIKE)
    @Excel(name = "展位编码")
    private String siteCode;

    /**
     * 展厅编码
     */
    @ApiModelProperty(value = "展厅编码")
    @Size(max = 255, message = "展厅编码长度不能超过255")
    @TableField(value = "space_code", condition = LIKE)
    @Excel(name = "展厅编码")
    private String spaceCode;

    /**
     * 向场馆一键报馆号
     */
    @ApiModelProperty(value = "向场馆一键报馆号")
    @Size(max = 255, message = "向场馆一键报馆号长度不能超过255")
    @TableField(value = "report_venue_space_number", condition = LIKE)
    @Excel(name = "向场馆一键报馆号")
    private String reportVenueSpaceNumber;

    /**
     * 支付状态 #{PAYED:已支付;UN_PAY:待支付}
     */
    @ApiModelProperty(value = "支付状态 #{PAYED:已支付;UN_PAY:待支付}")
    @TableField(value = "pay_state")
    @Excel(name = "支付状态 #{PAYED:已支付;UN_PAY:待支付}", replace = {"已支付_PAYED", "待支付_UN_PAY",  "_null"})
    private ServiceBookingPayStateEnum payState;

    /**
     * 参展商id
     */
    @ApiModelProperty(value = "参展商id")
    @TableField(value = "exhibitor_id")
    @Excel(name = "参展商id")
    private Long exhibitorId;

    /**
     * 订单编号
     */
    @ApiModelProperty(value = "订单编号")
    @Size(max = 255, message = "订单编号长度不能超过255")
    @TableField(value = "order_number", condition = LIKE)
    @Excel(name = "订单编号")
    private String orderNumber;

    /**
     * 折后单价
     */
    @ApiModelProperty(value = "折后单价")
    @TableField(value = "unit_price_after_discount")
    @Excel(name = "折后单价")
    private BigDecimal unitPriceAfterDiscount;

    /**
     * 服务总价金额
     */
    @ApiModelProperty(value = "服务总价金额")
    @TableField(value = "subtotal_service_price")
    @Excel(name = "服务总价金额")
    private BigDecimal subtotalServicePrice;

    /**
     * 附加费总金额
     */
    @ApiModelProperty(value = "附加费总金额")
    @TableField(value = "subtotal_surcharge_price")
    @Excel(name = "附加费总金额")
    private BigDecimal subtotalSurchargePrice;

    /**
     * 小计
     */
    @ApiModelProperty(value = "小计")
    @TableField(value = "subtotal_price")
    @Excel(name = "小计")
    private BigDecimal subtotalPrice;

    /**
     * 订单状态 #{NOT_SUBMIT:未提交;SUBMIT:已提交;DISPATCH:已派单;RECEIVE:已接单;COMPLETE:已完成;CANCEL:已取消}
     */
    @ApiModelProperty(value = "订单状态 #{NOT_SUBMIT:未提交;SUBMIT:已提交;DISPATCH:已派单;RECEIVE:已接单;COMPLETE:已完成;CANCEL:已取消}")
    @TableField(value = "order_status")
    @Excel(name = "订单状态 #{NOT_SUBMIT:未提交;SUBMIT:已提交;DISPATCH:已派单;RECEIVE:已接单;COMPLETE:已完成;CANCEL:已取消}", replace = {"未提交_NOT_SUBMIT", "已提交_SUBMIT", "已派单_DISPATCH", "已接单_RECEIVE", "已完成_COMPLETE", "已取消_CANCEL",  "_null"})
    private ServiceBookingOrderStatusEnum orderStatus;

    /**
     * 报馆状态 #{NOT_REPORTED:未提交;REPORTED:已提交}
     */
    @ApiModelProperty(value = "报馆状态 #{NOT_REPORTED:未提交;REPORTED:已提交}")
    @TableField(value = "report_space_status")
    @Excel(name = "报馆状态 #{NOT_REPORTED:未提交;REPORTED:已提交}", replace = {"未提交_NOT_REPORTED", "已提交_REPORTED",  "_null"})
    private ServiceBookingReportSpaceStatusEnum reportSpaceStatus;

    /**
     * 展位号
     */
    @ApiModelProperty(value = "展位号")
    @Size(max = 255, message = "展位号长度不能超过255")
    @TableField(value = "site_name", condition = LIKE)
    @Excel(name = "展位号")
    private String siteName;

    /**
     * 展厅号
     */
    @ApiModelProperty(value = "展厅号")
    @Size(max = 255, message = "展厅号长度不能超过255")
    @TableField(value = "space_name", condition = LIKE)
    @Excel(name = "展厅号")
    private String spaceName;

    /**
     * 工单状态 #{NOT_DISPATCH:未派工;HAS_DISPATCH:已派单;HAS_RECEIVE:已接单;PARTIAL_COMPLETE:部分完成;COMPLETE:已完成}
     */
    @ApiModelProperty(value = "工单状态 #{NOT_DISPATCH:未派工;HAS_DISPATCH:已派单;HAS_RECEIVE:已接单;PARTIAL_COMPLETE:部分完成;COMPLETE:已完成}")
    @TableField(value = "work_order_status")
    @Excel(name = "工单状态 #{NOT_DISPATCH:未派工;HAS_DISPATCH:已派单;HAS_RECEIVE:已接单;PARTIAL_COMPLETE:部分完成;COMPLETE:已完成}", replace = {"未派工_NOT_DISPATCH", "已派单_HAS_DISPATCH", "已接单_HAS_RECEIVE", "部分完成_PARTIAL_COMPLETE", "已完成_COMPLETE",  "_null"})
    private ServiceBookingWorkOrderStatusEnum workOrderStatus;

    /**
     * 工单编号
     */
    @ApiModelProperty(value = "工单编号")
    @Size(max = 255, message = "工单编号长度不能超过255")
    @TableField(value = "work_order_no", condition = LIKE)
    @Excel(name = "工单编号")
    private String workOrderNo;

    /**
     * 报馆时间
     */
    @ApiModelProperty(value = "报馆时间")
    @TableField(value = "report_space_time")
    @Excel(name = "报馆时间", format = DEFAULT_DATE_TIME_FORMAT, width = 20)
    private LocalDateTime reportSpaceTime;

    /**
     * 参展商名称
     */
    @ApiModelProperty(value = "参展商名称")
    @Size(max = 255, message = "参展商名称长度不能超过255")
    @TableField(value = "exhibitor_name", condition = LIKE)
    @Excel(name = "参展商名称")
    private String exhibitorName;

    /**
     * 结算单号
     */
    @ApiModelProperty(value = "结算单号")
    @Size(max = 255, message = "结算单号长度不能超过255")
    @TableField(value = "settlement_no", condition = LIKE)
    @Excel(name = "结算单号")
    private String settlementNo;

    /**
     * 主场ID
     */
    @ApiModelProperty(value = "主场ID")
    @TableField(value = "home_id")
    @Excel(name = "主场ID")
    private Long homeId;

    /**
     * 搭建商结算单号
     */
    @ApiModelProperty(value = "搭建商结算单号")
    @Size(max = 255, message = "搭建商结算单号长度不能超过255")
    @TableField(value = "builder_settlement_no", condition = LIKE)
    @Excel(name = "搭建商结算单号")
    private String builderSettlementNo;

    /**
     * 报馆核定状态(搭建商预定服务专用) #{NOT_CHECK:未核定;HAS_CHECK:已核定}
     */
    @ApiModelProperty(value = "报馆核定状态(搭建商预定服务专用) #{NOT_CHECK:未核定;HAS_CHECK:已核定}")
    @TableField(value = "report_check_status")
    @Excel(name = "报馆核定状态(搭建商预定服务专用) #{NOT_CHECK:未核定;HAS_CHECK:已核定}", replace = {"未核定_NOT_CHECK", "已核定_HAS_CHECK",  "_null"})
    private ServiceBookingReportCheckStatusEnum reportCheckStatus;

    /**
     * 槽位(搭建商预定服务专用)
     */
    @ApiModelProperty(value = "槽位(搭建商预定服务专用)")
    @Size(max = 200, message = "槽位(搭建商预定服务专用)长度不能超过200")
    @TableField(value = "slot", condition = LIKE)
    @Excel(name = "槽位(搭建商预定服务专用)")
    private String slot;

    /**
     * 业务主体名称
     */
    @ApiModelProperty(value = "业务主体名称")
    @Size(max = 255, message = "业务主体名称长度不能超过255")
    @TableField(value = "business_name", condition = LIKE)
    @Excel(name = "业务主体名称")
    private String businessName;


    @Builder
    public ServiceBooking(Long id, Long createdBy, LocalDateTime createTime, Long updatedBy, LocalDateTime updateTime, 
                    Integer isEnabled, Integer isDeleted, Long projectId, Long subsystemId, Long tenantId, 
                    Long serviceItemId, String serviceName, String picUrl, String calUnit, BigDecimal unitPrice, BigDecimal surcharge, 
                    Long serviceCategoryId, Long serviceSpecsId, Long bookingNum, String remark, String auditState, String auditOpinion, 
                    Integer generateOrder, LocalDateTime bookingTime, Long exhibitionManageId, Long reportSpaceId, String declarationSystem, String providerSystem, 
                    BigDecimal discount, Long businessId, String siteCode, String spaceCode, String reportVenueSpaceNumber, ServiceBookingPayStateEnum payState, 
                    Long exhibitorId, String orderNumber, BigDecimal unitPriceAfterDiscount, BigDecimal subtotalServicePrice, BigDecimal subtotalSurchargePrice, BigDecimal subtotalPrice, 
                    ServiceBookingOrderStatusEnum orderStatus, ServiceBookingReportSpaceStatusEnum reportSpaceStatus, String siteName, String spaceName, ServiceBookingWorkOrderStatusEnum workOrderStatus, String workOrderNo, 
                    LocalDateTime reportSpaceTime, String exhibitorName, String settlementNo, Long homeId, String builderSettlementNo, ServiceBookingReportCheckStatusEnum reportCheckStatus, 
                    String slot, String businessName) {
        this.id = id;
        this.createdBy = createdBy;
        this.createTime = createTime;
        this.updatedBy = updatedBy;
        this.updateTime = updateTime;
        this.isEnabled = isEnabled;
        this.isDeleted = isDeleted;
        this.projectId = projectId;
        this.subsystemId = subsystemId;
        this.tenantId = tenantId;
        this.serviceItemId = serviceItemId;
        this.serviceName = serviceName;
        this.picUrl = picUrl;
        this.calUnit = calUnit;
        this.unitPrice = unitPrice;
        this.surcharge = surcharge;
        this.serviceCategoryId = serviceCategoryId;
        this.serviceSpecsId = serviceSpecsId;
        this.bookingNum = bookingNum;
        this.remark = remark;
        this.auditState = auditState;
        this.auditOpinion = auditOpinion;
        this.generateOrder = generateOrder;
        this.bookingTime = bookingTime;
        this.exhibitionManageId = exhibitionManageId;
        this.reportSpaceId = reportSpaceId;
        this.declarationSystem = declarationSystem;
        this.providerSystem = providerSystem;
        this.discount = discount;
        this.businessId = businessId;
        this.siteCode = siteCode;
        this.spaceCode = spaceCode;
        this.reportVenueSpaceNumber = reportVenueSpaceNumber;
        this.payState = payState;
        this.exhibitorId = exhibitorId;
        this.orderNumber = orderNumber;
        this.unitPriceAfterDiscount = unitPriceAfterDiscount;
        this.subtotalServicePrice = subtotalServicePrice;
        this.subtotalSurchargePrice = subtotalSurchargePrice;
        this.subtotalPrice = subtotalPrice;
        this.orderStatus = orderStatus;
        this.reportSpaceStatus = reportSpaceStatus;
        this.siteName = siteName;
        this.spaceName = spaceName;
        this.workOrderStatus = workOrderStatus;
        this.workOrderNo = workOrderNo;
        this.reportSpaceTime = reportSpaceTime;
        this.exhibitorName = exhibitorName;
        this.settlementNo = settlementNo;
        this.homeId = homeId;
        this.builderSettlementNo = builderSettlementNo;
        this.reportCheckStatus = reportCheckStatus;
        this.slot = slot;
        this.businessName = businessName;
    }

}
